package com.wgt.observer.option_status;

import java.util.Vector;

/**
 * 目标对象，提供给观察者
 * 区别对待观察者
 * 根据观察者不同的需要，给予观察者不同的结果
 * 需要notifyObservers方法交给子类实现
 * Created by wgt on 2017/6/18.
 */
public abstract class WGTObservable  {
    //标识状态是否已经改变
    protected boolean changed = false;
    protected Vector<WGTObserver> obs;


    public WGTObservable(){
        obs = new Vector<>();
    }


    /**
     * 注册观察者
     * @param o
     */
    public synchronized void addObserver(WGTObserver o) {
        if (o == null)
            throw new NullPointerException();
        if (!obs.contains(o)) {
            obs.addElement(o);
        }
    }

    /**
     *移除观察者
     * @param o
     */
    public synchronized void deleteObserver(WGTObserver o){
        if (o == null){
            throw new NullPointerException();
        }
        if (obs.contains(o)){
            obs.removeElement(o);
        }
    }

    /**
     * 清空观察者集合
     */
    public synchronized void clearObservers(){
        obs.removeAllElements();
    }

    /**
     * 更新状态
     */
    protected synchronized void setChanged(){
        changed=true;
    }

    /**
     * 还原初始状态（未更新状态）
     */
    protected synchronized void clearChanged() {
        changed = false;
    }

    /**
     * 获取当前状态
     * @return false 未更新
     *          true 已更新
     */
    public synchronized boolean hasChanged() {
        return changed;
    }

    /**
     * 返回当前观察者数量
     * @return
     */
    public synchronized int countObservers() {
        return obs.size();
    }


    /**
     * 需要子类实现的通知方法
     * @param o
     */
    protected abstract void notifyObservers(Object o);

    protected abstract void notifyObservers();
}
